import Request from "./request";
import apiList from "./apis.js";
import store from "@/shopro/store/index.js";

const shoproRequest = new Request();
export default function http(
	url,
	data = {},
	toastBefore = "", // 请求前加载提示
	toastAfter = true // 请求后错误提示
) {
	let api = getApiPath(url);
	/* 请求之前拦截器 */
	shoproRequest.interceptor.request((config, cancel) => {
		let token = uni.getStorageSync("token");
		if (api.auth && !token) {
			store.dispatch("showAuthModal");
			uni.hideLoading();
			throw `暂未登录,已阻止此次API请求: '${api.url}'`;
		}
		token &&
			shoproRequest.setConfig(config => {
				config.header.token = token;
			});
		if (toastBefore !== "") {
			uni.showLoading({
				title: toastBefore,
				mask: true,
			});
		}
		return config;
	});

	/* 请求之后拦截器 */
	shoproRequest.interceptor.response(response => {
		uni.hideLoading();
		if (response.code === 0) {
			if (toastAfter) {
				uni.showToast({
					title: response.msg || "请求出错,稍后重试",
					icon: "none",
					duration: 1000,
					mask: true,
				});
			}
		}

		// token过期注销
		if (response.code === 401) {
			store.dispatch("logout");
			store.dispatch("showAuthModal");
			throw `登录已过期或注销,已阻止此次API请求: '${api.url}'`;
		}
		return response;
	});

	if (!api) {
		throw "请求地址不存在" + api;
	}
	return shoproRequest.request({
		url: api.url,
		data,
		method: api.method,
	});
}

// 组装接口路径
function getApiPath(url) {
	let apiArray = url.split(".");
	let api = apiList;
	apiArray.forEach(v => {
		api = api[v];
	});
	return api;
}
